/**
  ******************************************************************************
  * @author     Chris
  * @since      2024/7/12 22:23
  *
  * @file       hd_oled_font.c
  * @brief      Xxx hardware driver.
  *
  * @note       This file contains the hardware driver for the Xxx.
  *
  * @warning    None.
  ******************************************************************************
  * Change Logs:
  *   Date          Author       Notes
  *   2024/7/12     Chris        the first version
  *
  ******************************************************************************
  */


#include <hd_oled_font.h>
#include <stdlib.h>
#include <string.h>

static uint8_t OLEDFont_getCharDotMatrix(uint8_t* dotMatrix, uint8_t fontSize, const uint8_t* font);

/**
 * UTF-8 encoder convert to Unicode charset
 *
 *
 * /------------------------------------------------------------------------------------------\
 * |         Unicode              |                          UTF-8                            |
 * |------------------------------| ----------|-----------|-----------|-----------|-----------|
 * | rank range            | bits | 1st byte  | 2nd byte  | 3rd byte  | 4th byte  | 5th byte  |
 * |-----------------------|------|-----------|-----------|-----------|-----------|-----------|
 * | 0000 0000 - 0000 007F |   7  | 0xxx xxxx |           |           |           |           |
 * | 0000 0080 - 0000 07FF |  11  | 110x xxxx | 10xx xxxx |           |           |           |
 * | 0000 0800 - 0000 FFFF |  16  | 1110 xxxx | 10xx xxxx | 10xx xxxx |           |           |
 * | 0001 0000 - 0010 FFFF |  21  | 1111 0xxx | 10xx xxxx | 10xx xxxx | 10xx xxxx |           |
 * | 0020 0000 - 03FF FFFF |  26  | 1111 10xx | 10xx xxxx | 10xx xxxx | 10xx xxxx | 10xx xxxx |
 * -------------------------------------------------------------------------------------------/
 *
 * @param unicode result of converting from utf8
 * @param utf8    the font array encoder by utf8
 * @return        the font array length
 */
static uint8_t utf8ToUnicode(uint8_t* unicode, const uint8_t* utf8) {
    if ((*utf8 >> 7) == 0) {
        // 1 byte utf8, 7 bits, ASCII
        *(unicode + 0) = *utf8;
        return 1;
    } else if ((*utf8 >> 5) == 0x6) {
        // 2 bytes utf8, 11 bits unicode
        *(unicode + 0) = ((*(utf8 + 0) & 0x1F) >> 2);                               // 3 bits
        *(unicode + 1) = ((*(utf8 + 0) & 0x03) << 6) | ((*(utf8 + 1) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 2;
    } else if ((*utf8 >> 4) == 0xE) {
        // 3 bytes utf8, 16 bits unicode,
        *(unicode + 0) = ((*(utf8 + 0) & 0x0F) << 4) | ((*(utf8 + 1) >> 2) & 0x0F); // 8 bits = 4 + 4
        *(unicode + 1) = ((*(utf8 + 1) & 0x03) << 6) | ((*(utf8 + 2) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 3;
    } else if ((*utf8 >> 3) == 0x1E) {
        // 4 bytes utf8, 21 bits unicode,
        *(unicode + 0) = ((*(utf8 + 0) & 0x07) << 2) | ((*(utf8 + 1) >> 4) & 0x03); // 5 bits = 3 + 2
        *(unicode + 1) = ((*(utf8 + 1) & 0x0F) << 4) | ((*(utf8 + 2) >> 2) & 0x0F); // 8 bits = 4 + 4
        *(unicode + 2) = ((*(utf8 + 2) & 0x03) << 6) | ((*(utf8 + 3) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 4;
    } else if ((*utf8 >> 2) == 0x3E) {
        // 5 bytes utf8, 26 bits unicode,
        *(unicode + 0) = *utf8 & 0x03;                                              // 2 bits
        *(unicode + 1) = ((*(utf8 + 1) & 0x3F) << 2) | ((*(utf8 + 2) >> 4) & 0x03); // 8 bits = 6 + 2
        *(unicode + 2) = ((*(utf8 + 2) & 0x0F) << 4) | ((*(utf8 + 3) >> 2) & 0x0F); // 8 bits = 4 + 4
        *(unicode + 3) = ((*(utf8 + 3) & 0x03) << 6) | ((*(utf8 + 4) >> 0) & 0x3F); // 8 bits = 2 + 6
        return 5;
    } else {
        return 0;
    }
}

static uint32_t getAsciiAddress(const uint8_t fontSize, const uint8_t* unicodeArr) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. ASCII: 0x00~0x7F; CN_ZH:0x4E00~0x9FA5
    const uint32_t offset = unicodeArr[0];
    // Dot matrix bytes
    const uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize / 2;

    switch (fontSize) {
        case 12: addr = STORAGE_ASCII_12X6_ADDRESS;
            break;
        case 16: addr = STORAGE_ASCII_16X8_ADDRESS;
            break;
        case 24: addr = STORAGE_ASCII_24X12_ADDRESS;
            break;
        default: addr = 0;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

static uint32_t getUnicodeAddress(const uint8_t fontSize, const uint8_t* unicodeArr) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. ASCII: 0x00~0x7F; CN_ZH:0x4E00~0x9FA5
    const uint32_t offset = ((unicodeArr[0] << 8) + unicodeArr[1] - 0x4E00);
    // Dot matrix bytes
    const uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    switch (fontSize) {
        case 12: addr = STORAGE_UNICODE_CN_ZH_12X12_ADDRESS;
            break;
        case 16: addr = STORAGE_UNICODE_CN_ZH_16X16_ADDRESS;
            break;
        case 24: addr = STORAGE_UNICODE_CN_ZH_24X24_ADDRESS;
            break;
        default: addr = 0;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

static uint32_t getGBKAddress(const uint8_t fontSize, const uint8_t* fontCN) {
    // Dot matrix address
    uint32_t addr;
    // Dot matrix address offset. GBK(0xA1A1 ~ 0xFEFE) has 94 region, and 94 code position at per region.
    const uint32_t offset = ((fontCN[0] - 0xA0 - 1) * 94 + (fontCN[1] - 0xA0 - 1));
    // Dot matrix bytes
    const uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    switch (fontSize) {
        case 12: addr = STORAGE_GBK_12X12_ADDRESS;
            break;
        case 16: addr = STORAGE_GBK_16X16_ADDRESS;
            break;
        case 24: addr = STORAGE_GBK_24X24_ADDRESS;
            break;
        default: addr = STORAGE_GBK_12X12_ADDRESS;
            break;
    }

    addr += offset * fontByteSize;
    return addr;
}

static uint8_t OLEDFont_getFontDotMatrix_(const OLEDFont* this, uint8_t* dotMatrix, const uint8_t* font,
                                         const uint8_t fontSize) {
    // Dot matrix bytes
    const uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * fontSize;

    if ((*font >> 7) == 0) {
        if (OLEDFont_getCharDotMatrix(dotMatrix, fontSize, font) == 0) {
            const uint32_t storageAddress = getAsciiAddress(fontSize, font);
            this->storage->vptr->read(this->storage, dotMatrix, storageAddress, fontByteSize / 2);
        }
        return 1;
    }

    // The font that encode by utf8 should convert to unicode, GBK can read directly.
    if (this->encoding == ENCODING_UTF8) {
        // the array that storage the data after converting from utf8 to unicode
        uint8_t unicodeArray[5] = {0};
        // the count that the font encode by utf8
        const uint8_t fontBytes = utf8ToUnicode(unicodeArray, font);
        // the font location
        const uint32_t storageAddress = getUnicodeAddress(fontSize, unicodeArray);

        Storage_read(this->storage, dotMatrix, storageAddress, fontByteSize);
        return fontBytes;
    }

    if (this->encoding == ENCODING_GBK) {
        const uint32_t storageAddr = getGBKAddress(fontSize, font);
        Storage_read(this->storage, dotMatrix, storageAddr, fontByteSize);
        return 2;
    }

    return 0;
}

void OLEDFont_contructor(OLEDFont* this, Storage* storage) {
    static struct OLEDFontVtbl const vtbl = {
        .get_font_dot_matrix = &OLEDFont_getFontDotMatrix_
    };
    this->vptr = &vtbl;
    this->storage = storage;
    this->encoding = ENCODING_UTF8;
}


/** region Image test: eve serious of WALL-E */
const uint8_t eveSerious[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00,
    0x00, 0x00,
    0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0xE0,
    0xFF, 0xFF,
    0x00, 0x00, 0xF0, 0xFF, 0x7F, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x00, 0x00,
    0xFF, 0xFF,
    0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0x3F, 0xFC, 0xF7,
    0xFF, 0xFF,
    0x00, 0xF0, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFC,
    0xFF, 0x00,
    0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE,
    0xFF, 0xFF,
    0x80, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xC0, 0xFF,
    0x4F, 0x00,
    0x00, 0xFC, 0xFF, 0xFF, 0xE0, 0xFF, 0x67, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0xE0, 0xFF, 0x33, 0xF8, 0x01, 0xF8,
    0xFF, 0xFF,
    0xF0, 0xFF, 0x13, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0x19, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF,
    0x09, 0xF8,
    0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0,
    0xFF, 0xFF,
    0xF8, 0xFF, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F,
    0x00, 0xE0,
    0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0,
    0xFF, 0xFF,
    0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F,
    0x00, 0x00,
    0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0,
    0xFF, 0xFF,
    0xFC, 0x7F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F,
    0x00, 0xE0,
    0x03, 0xF0, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0x7F, 0x00, 0xF0, 0x07, 0xF0,
    0xFF, 0xFF,
    0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF,
    0x00, 0xF8,
    0x07, 0xF0, 0xFF, 0xFF, 0xF0, 0xFF, 0x01, 0xF8, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0x01, 0xF8, 0x03, 0xF8,
    0xFF, 0xFF,
    0xE0, 0xFF, 0x03, 0xF8, 0x01, 0xF8, 0xFF, 0xFF, 0xE0, 0xFF, 0x03, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0xC0, 0xFF,
    0x07, 0x00,
    0x00, 0xFC, 0xFF, 0xFF, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x80, 0xFF, 0x0F, 0x00, 0x00, 0xFE,
    0xFF, 0xFF,
    0x00, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFC,
    0x7F, 0x00,
    0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x03, 0xC0, 0xFF,
    0xFF, 0xFF,
    0x00, 0xE0, 0xFF, 0x0F, 0xF0, 0xF7, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x80,
    0xFF, 0xFF,
    0xFF, 0xE3, 0xFF, 0x07, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xE1, 0xFF, 0xF8, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xE0,
    0x3F, 0xFF,
    0x00, 0x00, 0xE0, 0xFF, 0x3F, 0xE0, 0x9F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0xC0, 0xDF, 0xFF, 0x00, 0x00,
    0x00, 0xF0,
    0x03, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF
};
/** endregion */

/** region Image test: eve smile of WALL-E */
const uint8_t eveSmile[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xF0,
    0x01, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xF0, 0xFF, 0x7F, 0xF0,
    0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF,
    0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0,
    0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0x00, 0xF8, 0xFF, 0xFF, 0xF3, 0x00, 0xFC, 0x3F, 0x00,
    0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0xFE, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x0F, 0x00, 0xC0, 0xFF,
    0xFF, 0xFF, 0x80, 0xFF, 0x07, 0x30, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0x38, 0x80, 0xFF, 0xFF, 0xFF,
    0xC0, 0xFF, 0x01, 0x3C, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F,
    0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0x00, 0x1E,
    0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x0E, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x1E, 0x00, 0xFF,
    0xFF, 0xFF, 0xFC, 0x1F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF,
    0xFC, 0x0F, 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x07,
    0x00, 0x30, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00,
    0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF,
    0xFF, 0xFF, 0xFE, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
    0xFC, 0x07, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F,
    0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x1E,
    0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x00, 0x0E, 0x00, 0xFF,
    0xFF, 0xFF, 0xF0, 0x3F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xFF,
    0xE0, 0xFF, 0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0x1E, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF,
    0x01, 0x3C, 0x80, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0x38, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x07, 0x20,
    0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0x3F, 0x00, 0xE0, 0xFF,
    0xFF, 0xFF, 0x00, 0xFC, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0xF7,
    0x00, 0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x80,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0xF8, 0xFF,
    0x7F, 0xF8, 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0xFF, 0x3F, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0xF0,
    0xFF, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0

};
/** endregion */


// ASCII charset(32~125): !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

/** region 12*6 ASCII font library */
const unsigned char asc_1206[][12] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/
    {0x00, 0x00, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/
    {0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00}, /*""",2*/
    {0x90, 0x00, 0xFC, 0x03, 0x90, 0x00, 0xFC, 0x03, 0x90, 0x00, 0x00, 0x00}, /*"#",3*/
    {0x18, 0x01, 0x24, 0x02, 0xFE, 0x07, 0x44, 0x02, 0x88, 0x01, 0x00, 0x00}, /*"$",4*/
    {0x38, 0x00, 0x44, 0x03, 0xF8, 0x00, 0xD0, 0x01, 0x2C, 0x02, 0xC0, 0x01}, /*"%",5*/
    {0xC0, 0x01, 0x38, 0x02, 0xE4, 0x02, 0x18, 0x01, 0xE0, 0x02, 0x20, 0x01}, /*"&",6*/
    {0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/
    {0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x06, 0x03, 0x01, 0x04, 0x00, 0x00}, /*"(",8*/
    {0x00, 0x00, 0x01, 0x04, 0x06, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00}, /*")",9*/
    {0x90, 0x00, 0x60, 0x00, 0xF8, 0x01, 0x60, 0x00, 0x90, 0x00, 0x00, 0x00}, /*"*",10*/
    {0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x00, 0x20, 0x00, 0x20, 0x00}, /*"+",11*/
    {0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*",",12*/
    {0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00}, /*"-",13*/
    {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*".",14*/
    {0x00, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x02, 0x00}, /*"/",15*/
    {0xF8, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xF8, 0x01, 0x00, 0x00}, /*"0",16*/
    {0x00, 0x00, 0x08, 0x02, 0xFC, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, /*"1",17*/
    {0x18, 0x03, 0x84, 0x02, 0x44, 0x02, 0x24, 0x02, 0x18, 0x02, 0x00, 0x00}, /*"2",18*/
    {0x08, 0x01, 0x04, 0x02, 0x24, 0x02, 0x24, 0x02, 0xD8, 0x01, 0x00, 0x00}, /*"3",19*/
    {0xC0, 0x00, 0xA0, 0x00, 0x98, 0x02, 0xFC, 0x03, 0x80, 0x02, 0x00, 0x00}, /*"4",20*/
    {0x7C, 0x01, 0x24, 0x02, 0x24, 0x02, 0x24, 0x02, 0xC4, 0x01, 0x00, 0x00}, /*"5",21*/
    {0xF0, 0x01, 0x48, 0x02, 0x24, 0x02, 0x24, 0x02, 0xC8, 0x01, 0x00, 0x00}, /*"6",22*/
    {0x00, 0x00, 0x04, 0x00, 0xC4, 0x03, 0x34, 0x00, 0x0C, 0x00, 0x00, 0x00}, /*"7",23*/
    {0xD8, 0x01, 0x24, 0x02, 0x24, 0x02, 0x24, 0x02, 0xD8, 0x01, 0x00, 0x00}, /*"8",24*/
    {0x38, 0x01, 0x44, 0x02, 0x44, 0x02, 0x24, 0x01, 0xF8, 0x00, 0x00, 0x00}, /*"9",25*/
    {0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*":",26*/
    {0x00, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*";",27*/
    {0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x08, 0x01, 0x04, 0x02, 0x00, 0x00}, /*"<",28*/
    {0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00}, /*"=",29*/
    {0x00, 0x00, 0x04, 0x02, 0x08, 0x01, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00}, /*">",30*/
    {0x18, 0x00, 0x04, 0x00, 0xC4, 0x02, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"?",31*/
    {0xF0, 0x00, 0x08, 0x01, 0xE4, 0x02, 0xF4, 0x02, 0x84, 0x02, 0x78, 0x01}, /*"@",32*/
    {0x00, 0x02, 0xE0, 0x03, 0x9C, 0x00, 0xF0, 0x00, 0x80, 0x03, 0x00, 0x02}, /*"A",33*/
    {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x24, 0x02, 0xD8, 0x01, 0x00, 0x00}, /*"B",34*/
    {0xF8, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x0C, 0x01, 0x00, 0x00}, /*"C",35*/
    {0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x04, 0x02, 0xF8, 0x01, 0x00, 0x00}, /*"D",36*/
    {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x74, 0x02, 0x0C, 0x03, 0x00, 0x00}, /*"E",37*/
    {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x74, 0x00, 0x0C, 0x00, 0x00, 0x00}, /*"F",38*/
    {0xF0, 0x00, 0x08, 0x01, 0x04, 0x02, 0x44, 0x02, 0xCC, 0x01, 0x40, 0x00}, /*"G",39*/
    {0x04, 0x02, 0xFC, 0x03, 0x20, 0x00, 0x20, 0x00, 0xFC, 0x03, 0x04, 0x02}, /*"H",40*/
    {0x04, 0x02, 0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x04, 0x02, 0x00, 0x00}, /*"I",41*/
    {0x00, 0x0C, 0x04, 0x08, 0x04, 0x08, 0xFC, 0x07, 0x04, 0x00, 0x04, 0x00}, /*"J",42*/
    {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x50, 0x00, 0x8C, 0x03, 0x04, 0x02}, /*"K",43*/
    {0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03}, /*"L",44*/
    {0xFC, 0x03, 0x3C, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0xFC, 0x03, 0x04, 0x02}, /*"M",45*/
    {0x04, 0x02, 0xFC, 0x03, 0x30, 0x02, 0xC4, 0x00, 0xFC, 0x03, 0x04, 0x00}, /*"N",46*/
    {0xF8, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xF8, 0x01, 0x00, 0x00}, /*"O",47*/
    {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"P",48*/
    {0xF8, 0x01, 0x84, 0x02, 0x84, 0x02, 0x04, 0x07, 0xF8, 0x05, 0x00, 0x00}, /*"Q",49*/
    {0x04, 0x02, 0xFC, 0x03, 0x24, 0x02, 0x64, 0x00, 0x98, 0x03, 0x00, 0x02}, /*"R",50*/
    {0x18, 0x03, 0x24, 0x02, 0x24, 0x02, 0x44, 0x02, 0x8C, 0x01, 0x00, 0x00}, /*"S",51*/
    {0x0C, 0x00, 0x04, 0x02, 0xFC, 0x03, 0x04, 0x02, 0x0C, 0x00, 0x00, 0x00}, /*"T",52*/
    {0x04, 0x00, 0xFC, 0x01, 0x00, 0x02, 0x00, 0x02, 0xFC, 0x01, 0x04, 0x00}, /*"U",53*/
    {0x04, 0x00, 0x7C, 0x00, 0x80, 0x03, 0xE0, 0x00, 0x1C, 0x00, 0x04, 0x00}, /*"V",54*/
    {0x3C, 0x00, 0xC0, 0x03, 0x7C, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0x00}, /*"W",55*/
    {0x04, 0x02, 0x9C, 0x03, 0x60, 0x00, 0x9C, 0x03, 0x04, 0x02, 0x00, 0x00}, /*"X",56*/
    {0x04, 0x00, 0x3C, 0x02, 0xC0, 0x03, 0x3C, 0x02, 0x04, 0x00, 0x00, 0x00}, /*"Y",57*/
    {0x0C, 0x02, 0x84, 0x03, 0x64, 0x02, 0x1C, 0x02, 0x04, 0x03, 0x00, 0x00}, /*"Z",58*/
    {0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x01, 0x04, 0x01, 0x04, 0x00, 0x00}, /*"[",59*/
    {0x00, 0x00, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x01, 0x00, 0x06, 0x00, 0x00}, /*"\",60*/
    {0x00, 0x00, 0x01, 0x04, 0x01, 0x04, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00}, /*"]",61*/
    {0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"^",62*/
    {0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08}, /*"_",63*/
    {0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/
    {0x00, 0x00, 0x40, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x03, 0x00, 0x02}, /*"a",65*/
    {0x02, 0x00, 0xFE, 0x03, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, 0x00, 0x00}, /*"b",66*/
    {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0x60, 0x01, 0x00, 0x00}, /*"c",67*/
    {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x22, 0x02, 0xFE, 0x03, 0x00, 0x02}, /*"d",68*/
    {0x00, 0x00, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x02, 0x00, 0x00}, /*"e",69*/
    {0x00, 0x00, 0x20, 0x02, 0xFC, 0x03, 0x22, 0x02, 0x22, 0x02, 0x04, 0x00}, /*"f",70*/
    {0x00, 0x00, 0x40, 0x05, 0xA0, 0x0A, 0xA0, 0x0A, 0x60, 0x0A, 0x20, 0x04}, /*"g",71*/
    {0x02, 0x02, 0xFE, 0x03, 0x20, 0x02, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x02}, /*"h",72*/
    {0x00, 0x00, 0x20, 0x02, 0xE6, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}, /*"i",73*/
    {0x00, 0x08, 0x00, 0x08, 0x20, 0x08, 0xE6, 0x07, 0x00, 0x00, 0x00, 0x00}, /*"j",74*/
    {0x02, 0x02, 0xFE, 0x03, 0x80, 0x00, 0x60, 0x01, 0x20, 0x02, 0x00, 0x00}, /*"k",75*/
    {0x02, 0x02, 0x02, 0x02, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00}, /*"l",76*/
    {0xE0, 0x03, 0x20, 0x00, 0xE0, 0x03, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x00}, /*"m",77*/
    {0x20, 0x02, 0xE0, 0x03, 0x20, 0x02, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x02}, /*"n",78*/
    {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, 0x00, 0x00}, /*"o",79*/
    {0x20, 0x08, 0xE0, 0x0F, 0x20, 0x0A, 0x20, 0x02, 0xC0, 0x01, 0x00, 0x00}, /*"p",80*/
    {0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x0A, 0xE0, 0x0F, 0x00, 0x08}, /*"q",81*/
    {0x20, 0x02, 0xE0, 0x03, 0x40, 0x02, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00}, /*"r",82*/
    {0x00, 0x00, 0x60, 0x02, 0xA0, 0x02, 0xA0, 0x02, 0x20, 0x03, 0x00, 0x00}, /*"s",83*/
    {0x00, 0x00, 0x20, 0x00, 0xF8, 0x03, 0x20, 0x02, 0x20, 0x02, 0x00, 0x00}, /*"t",84*/
    {0x20, 0x00, 0xE0, 0x01, 0x00, 0x02, 0x20, 0x02, 0xE0, 0x03, 0x00, 0x02}, /*"u",85*/
    {0x20, 0x00, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x20, 0x00, 0x00, 0x00}, /*"v",86*/
    {0x60, 0x00, 0x80, 0x03, 0xE0, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0x00}, /*"w",87*/
    {0x20, 0x02, 0x60, 0x03, 0x80, 0x00, 0x60, 0x03, 0x20, 0x02, 0x00, 0x00}, /*"x",88*/
    {0x20, 0x08, 0xE0, 0x08, 0x00, 0x05, 0x00, 0x03, 0xE0, 0x00, 0x20, 0x00}, /*"y",89*/
    {0x00, 0x00, 0x20, 0x02, 0xA0, 0x03, 0x60, 0x02, 0x20, 0x02, 0x00, 0x00}, /*"z",90*/
    {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xFF, 0x07, 0x01, 0x04, 0x00, 0x00}, /*"{",91*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00}, /*"|",92*/
    {0x00, 0x00, 0x01, 0x04, 0xDF, 0x07, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"}",93*/
    {0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00}, /*"~",94*/
};
/** endregion */

/** region 16*8 ASCII font library */
const unsigned char asc_1608[][16] = {

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/
    {0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00}, /*""",2*/
    {0x00, 0x00, 0x40, 0x04, 0xC0, 0x3F, 0x78, 0x04, 0x40, 0x04, 0xC0, 0x3F, 0x78, 0x04, 0x00, 0x00}, /*"#",3*/
    {0x00, 0x00, 0x70, 0x18, 0x88, 0x20, 0x88, 0x20, 0xFC, 0xFF, 0x08, 0x21, 0x30, 0x1E, 0x00, 0x00}, /*"$",4*/
    {0xF0, 0x00, 0x08, 0x31, 0xF0, 0x0C, 0x80, 0x03, 0x60, 0x1E, 0x18, 0x21, 0x00, 0x1E, 0x00, 0x00}, /*"%",5*/
    {0x00, 0x1E, 0xF0, 0x21, 0x08, 0x23, 0x88, 0x2C, 0x70, 0x19, 0x00, 0x27, 0x00, 0x21, 0x00, 0x10}, /*"&",6*/
    {0x00, 0x00, 0x12, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x02, 0x40, 0x00, 0x00}, /*"(",8*/
    {0x00, 0x00, 0x02, 0x40, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*")",9*/
    {0x40, 0x02, 0x40, 0x02, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0x40, 0x02, 0x40, 0x02, 0x00, 0x00}, /*"*",10*/
    {0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xE0, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01}, /*"+",11*/
    {0x00, 0x00, 0x00, 0x90, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*",",12*/
    {0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00}, /*"-",13*/
    {0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*".",14*/
    {0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x07, 0xC0, 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0x00}, /*"/",15*/
    {0x00, 0x00, 0xE0, 0x0F, 0x10, 0x10, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10, 0xE0, 0x0F, 0x00, 0x00}, /*"0",16*/
    {0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x10, 0x20, 0xF8, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00}, /*"1",17*/
    {0x00, 0x00, 0x70, 0x30, 0x08, 0x28, 0x08, 0x24, 0x08, 0x22, 0x08, 0x21, 0xF0, 0x30, 0x00, 0x00}, /*"2",18*/
    {0x00, 0x00, 0x30, 0x18, 0x08, 0x20, 0x08, 0x21, 0x08, 0x21, 0x88, 0x22, 0x70, 0x1C, 0x00, 0x00}, /*"3",19*/
    {0x00, 0x00, 0x00, 0x06, 0x80, 0x05, 0x40, 0x24, 0x30, 0x24, 0xF8, 0x3F, 0x00, 0x24, 0x00, 0x24}, /*"4",20*/
    {0x00, 0x00, 0xF8, 0x19, 0x88, 0x20, 0x88, 0x20, 0x88, 0x20, 0x08, 0x11, 0x08, 0x0E, 0x00, 0x00}, /*"5",21*/
    {0x00, 0x00, 0xE0, 0x0F, 0x10, 0x11, 0x88, 0x20, 0x88, 0x20, 0x90, 0x20, 0x00, 0x1F, 0x00, 0x00}, /*"6",22*/
    {0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x3E, 0x88, 0x01, 0x68, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"7",23*/
    {0x00, 0x00, 0x70, 0x1C, 0x88, 0x22, 0x08, 0x21, 0x08, 0x21, 0x88, 0x22, 0x70, 0x1C, 0x00, 0x00}, /*"8",24*/
    {0x00, 0x00, 0xF0, 0x01, 0x08, 0x12, 0x08, 0x22, 0x08, 0x22, 0x10, 0x11, 0xE0, 0x0F, 0x00, 0x00}, /*"9",25*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*":",26*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*";",27*/
    {0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, 0x10, 0x10, 0x08, 0x20, 0x00, 0x00}, /*"<",28*/
    {0x00, 0x00, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x00, 0x00}, /*"=",29*/
    {0x00, 0x00, 0x08, 0x20, 0x10, 0x10, 0x20, 0x08, 0x40, 0x04, 0x80, 0x02, 0x00, 0x01, 0x00, 0x00}, /*">",30*/
    {0x00, 0x00, 0x70, 0x00, 0x48, 0x00, 0x08, 0x30, 0x08, 0x37, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00}, /*"?",31*/
    {0xC0, 0x07, 0x30, 0x18, 0xC8, 0x27, 0x28, 0x28, 0xE8, 0x2F, 0x10, 0x28, 0xE0, 0x17, 0x00, 0x00}, /*"@",32*/
    {0x00, 0x20, 0x00, 0x3C, 0xC0, 0x23, 0x38, 0x02, 0xE0, 0x02, 0x00, 0x27, 0x00, 0x38, 0x00, 0x20}, /*"A",33*/
    {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x20, 0x88, 0x20, 0x70, 0x11, 0x00, 0x0E, 0x00, 0x00}, /*"B",34*/
    {0xC0, 0x07, 0x30, 0x18, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0x10, 0x38, 0x08, 0x00, 0x00}, /*"C",35*/
    {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10, 0xE0, 0x0F, 0x00, 0x00}, /*"D",36*/
    {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x20, 0xE8, 0x23, 0x08, 0x20, 0x10, 0x18, 0x00, 0x00}, /*"E",37*/
    {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x00, 0xE8, 0x03, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00}, /*"F",38*/
    {0xC0, 0x07, 0x30, 0x18, 0x08, 0x20, 0x08, 0x20, 0x08, 0x22, 0x38, 0x1E, 0x00, 0x02, 0x00, 0x00}, /*"G",39*/
    {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x21, 0x00, 0x01, 0x00, 0x01, 0x08, 0x21, 0xF8, 0x3F, 0x08, 0x20}, /*"H",40*/
    {0x00, 0x00, 0x08, 0x20, 0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00}, /*"I",41*/
    {0x00, 0xC0, 0x00, 0x80, 0x08, 0x80, 0x08, 0x80, 0xF8, 0x7F, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00}, /*"J",42*/
    {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0xC0, 0x01, 0x28, 0x26, 0x18, 0x38, 0x08, 0x20, 0x00, 0x00}, /*"K",43*/
    {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00}, /*"L",44*/
    {0x08, 0x20, 0xF8, 0x3F, 0xF8, 0x01, 0x00, 0x3E, 0xF8, 0x01, 0xF8, 0x3F, 0x08, 0x20, 0x00, 0x00}, /*"M",45*/
    {0x08, 0x20, 0xF8, 0x3F, 0x30, 0x20, 0xC0, 0x00, 0x00, 0x07, 0x08, 0x18, 0xF8, 0x3F, 0x08, 0x00}, /*"N",46*/
    {0xE0, 0x0F, 0x10, 0x10, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10, 0xE0, 0x0F, 0x00, 0x00}, /*"O",47*/
    {0x08, 0x20, 0xF8, 0x3F, 0x08, 0x21, 0x08, 0x01, 0x08, 0x01, 0x08, 0x01, 0xF0, 0x00, 0x00, 0x00}, /*"P",48*/
    {0xE0, 0x0F, 0x10, 0x10, 0x08, 0x28, 0x08, 0x28, 0x08, 0x30, 0x10, 0x50, 0xE0, 0x4F, 0x00, 0x00}, /*"Q",49*/
    {0x08, 0x20, 0xF8, 0x3F, 0x88, 0x20, 0x88, 0x00, 0x88, 0x03, 0x88, 0x0C, 0x70, 0x30, 0x00, 0x20}, /*"R",50*/
    {0x00, 0x00, 0x70, 0x38, 0x88, 0x20, 0x08, 0x21, 0x08, 0x21, 0x08, 0x22, 0x38, 0x1C, 0x00, 0x00}, /*"S",51*/
    {0x18, 0x00, 0x08, 0x00, 0x08, 0x20, 0xF8, 0x3F, 0x08, 0x20, 0x08, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"T",52*/
    {0x08, 0x00, 0xF8, 0x1F, 0x08, 0x20, 0x00, 0x20, 0x00, 0x20, 0x08, 0x20, 0xF8, 0x1F, 0x08, 0x00}, /*"U",53*/
    {0x08, 0x00, 0x78, 0x00, 0x88, 0x07, 0x00, 0x38, 0x00, 0x0E, 0xC8, 0x01, 0x38, 0x00, 0x08, 0x00}, /*"V",54*/
    {0x08, 0x00, 0xF8, 0x03, 0x00, 0x3E, 0xF8, 0x01, 0x00, 0x3E, 0xF8, 0x03, 0x08, 0x00, 0x00, 0x00}, /*"W",55*/
    {0x08, 0x20, 0x18, 0x30, 0x68, 0x2C, 0x80, 0x03, 0x80, 0x03, 0x68, 0x2C, 0x18, 0x30, 0x08, 0x20}, /*"X",56*/
    {0x08, 0x00, 0x38, 0x00, 0xC8, 0x20, 0x00, 0x3F, 0xC8, 0x20, 0x38, 0x00, 0x08, 0x00, 0x00, 0x00}, /*"Y",57*/
    {0x10, 0x20, 0x08, 0x38, 0x08, 0x26, 0x08, 0x21, 0xC8, 0x20, 0x38, 0x20, 0x08, 0x18, 0x00, 0x00}, /*"Z",58*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x00, 0x00}, /*"[",59*/
    {0x00, 0x00, 0x04, 0x00, 0x38, 0x00, 0xC0, 0x01, 0x00, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x00}, /*"\",60*/
    {0x00, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"]",61*/
    {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"^",62*/
    {0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80}, /*"_",63*/
    {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/
    {0x00, 0x00, 0x00, 0x19, 0x80, 0x24, 0x80, 0x24, 0x80, 0x12, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x00}, /*"a",65*/
    {0x10, 0x00, 0xF0, 0x3F, 0x00, 0x11, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00}, /*"b",66*/
    {0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x00}, /*"c",67*/
    {0x00, 0x00, 0x00, 0x1F, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x90, 0x10, 0xF0, 0x3F, 0x00, 0x20}, /*"d",68*/
    {0x00, 0x00, 0x00, 0x1F, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x00, 0x17, 0x00, 0x00}, /*"e",69*/
    {0x00, 0x00, 0x80, 0x20, 0x80, 0x20, 0xE0, 0x3F, 0x90, 0x20, 0x90, 0x20, 0x20, 0x00, 0x00, 0x00}, /*"f",70*/
    {0x00, 0x00, 0x00, 0x6B, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x93, 0x80, 0x60, 0x00, 0x00}, /*"g",71*/
    {0x10, 0x20, 0xF0, 0x3F, 0x00, 0x21, 0x80, 0x00, 0x80, 0x00, 0x80, 0x20, 0x00, 0x3F, 0x00, 0x20}, /*"h",72*/
    {0x00, 0x00, 0x80, 0x20, 0x98, 0x20, 0x98, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, /*"i",73*/
    {0x00, 0x00, 0x00, 0xC0, 0x00, 0x80, 0x80, 0x80, 0x98, 0x80, 0x98, 0x7F, 0x00, 0x00, 0x00, 0x00}, /*"j",74*/
    {0x10, 0x20, 0xF0, 0x3F, 0x00, 0x24, 0x00, 0x06, 0x80, 0x29, 0x80, 0x30, 0x80, 0x20, 0x00, 0x00}, /*"k",75*/
    {0x00, 0x00, 0x10, 0x20, 0x10, 0x20, 0xF8, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00}, /*"l",76*/
    {0x80, 0x20, 0x80, 0x3F, 0x80, 0x20, 0x80, 0x00, 0x80, 0x3F, 0x80, 0x20, 0x80, 0x00, 0x00, 0x3F}, /*"m",77*/
    {0x80, 0x20, 0x80, 0x3F, 0x00, 0x21, 0x80, 0x00, 0x80, 0x00, 0x80, 0x20, 0x00, 0x3F, 0x00, 0x20}, /*"n",78*/
    {0x00, 0x00, 0x00, 0x1F, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x00, 0x1F, 0x00, 0x00}, /*"o",79*/
    {0x80, 0x80, 0x80, 0xFF, 0x00, 0x91, 0x80, 0x20, 0x80, 0x20, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00}, /*"p",80*/
    {0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x80, 0x20, 0x80, 0x20, 0x00, 0x91, 0x80, 0xFF, 0x00, 0x80}, /*"q",81*/
    {0x80, 0x20, 0x80, 0x20, 0x80, 0x3F, 0x00, 0x21, 0x80, 0x20, 0x80, 0x00, 0x80, 0x01, 0x00, 0x00}, /*"r",82*/
    {0x00, 0x00, 0x00, 0x33, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x19, 0x00, 0x00}, /*"s",83*/
    {0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xE0, 0x1F, 0x80, 0x20, 0x80, 0x20, 0x00, 0x10, 0x00, 0x00}, /*"t",84*/
    {0x80, 0x00, 0x80, 0x1F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x80, 0x10, 0x80, 0x3F, 0x00, 0x20}, /*"u",85*/
    {0x80, 0x00, 0x80, 0x03, 0x80, 0x0C, 0x00, 0x30, 0x80, 0x0C, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00}, /*"v",86*/
    {0x80, 0x01, 0x80, 0x0E, 0x00, 0x30, 0x80, 0x0C, 0x80, 0x07, 0x00, 0x38, 0x80, 0x06, 0x80, 0x01}, /*"w",87*/
    {0x00, 0x00, 0x80, 0x20, 0x80, 0x31, 0x80, 0x0E, 0x00, 0x2E, 0x80, 0x31, 0x80, 0x20, 0x00, 0x00}, /*"x",88*/
    {0x80, 0x00, 0x80, 0x81, 0x80, 0x86, 0x00, 0x78, 0x00, 0x18, 0x80, 0x06, 0x80, 0x01, 0x80, 0x00}, /*"y",89*/
    {0x00, 0x00, 0x80, 0x21, 0x80, 0x30, 0x80, 0x2C, 0x80, 0x22, 0x80, 0x21, 0x80, 0x30, 0x00, 0x00}, /*"z",90*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x3E, 0x02, 0x40, 0x02, 0x40}, /*"{",91*/
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"|",92*/
    {0x02, 0x40, 0x02, 0x40, 0xFC, 0x3E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"}",93*/
    {0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00}, /*"~",94*/


};
/** endregion */

/** region 24*12 ASICII font library */
const unsigned char asc_2412[95][36] = {
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*" ",0*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x77, 0x1C,
        0xF0, 0x0F, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"!",1*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1C, 0x00, 0x00,
        0x8C, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*""",2*/
    {
        0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x83, 0x1F, 0x00, 0xFF, 0x01, 0xF0, 0x83, 0x01, 0x00, 0x83, 0x01,
        0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0xFB, 0x1F, 0xF0, 0x87, 0x01, 0x00, 0x83, 0x01, 0x00, 0x00, 0x00
    }, /*"#",3*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x07, 0xC0, 0x07, 0x0F, 0x60, 0x0C, 0x12, 0x20, 0x18, 0x10,
        0xF8, 0xFF, 0x7F, 0x20, 0x71, 0x10, 0xE0, 0xE1, 0x0F, 0xC0, 0x81, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"$",4*/
    {
        0xC0, 0x07, 0x00, 0x30, 0x18, 0x00, 0x10, 0x10, 0x18, 0x30, 0x18, 0x07, 0xC0, 0xCF, 0x00, 0x00, 0x38, 0x00,
        0x00, 0xC6, 0x07, 0xC0, 0x31, 0x18, 0x30, 0x10, 0x10, 0x00, 0x30, 0x18, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00
    }, /*"%",5*/
    {
        0x00, 0xC0, 0x07, 0x00, 0xE0, 0x0F, 0xE0, 0x17, 0x18, 0xF0, 0x3F, 0x10, 0x10, 0xF8, 0x10, 0xF0, 0xC7, 0x13,
        0xE0, 0x03, 0x0F, 0x00, 0x08, 0x0E, 0x00, 0xF8, 0x19, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x0C
    }, /*"&",6*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"'",7*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
        0x80, 0x01, 0x03, 0x60, 0x00, 0x0C, 0x10, 0x00, 0x10, 0x08, 0x00, 0x20, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00
    }, /*"(",8*/
    {
        0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x08, 0x00, 0x20, 0x10, 0x00, 0x10, 0x60, 0x00, 0x0C, 0x80, 0x01, 0x03,
        0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*")",9*/
    {
        0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x24, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00,
        0xC0, 0xFF, 0x03, 0x80, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00
    }, /*"*",10*/
    {
        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
        0x80, 0xFF, 0x03, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00
    }, /*"+",11*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*",",12*/
    {
        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
        0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00
    }, /*"-",13*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*".",14*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x01, 0x00, 0x70, 0x00,
        0x00, 0x1C, 0x00, 0x00, 0x03, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"/",15*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x18, 0x20, 0x00, 0x10,
        0x20, 0x00, 0x10, 0x60, 0x00, 0x18, 0xC0, 0x01, 0x0E, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00
    }, /*"0",16*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xC0, 0xFF, 0x1F,
        0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"1",17*/
    {
        0x00, 0x00, 0x00, 0x80, 0x03, 0x18, 0x40, 0x03, 0x1C, 0x20, 0x00, 0x12, 0x20, 0x00, 0x11, 0x20, 0xC0, 0x10,
        0x20, 0x60, 0x10, 0x60, 0x30, 0x10, 0xC0, 0x1F, 0x10, 0x80, 0x07, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"2",18*/
    {
        0x00, 0x00, 0x00, 0xC0, 0x01, 0x0E, 0xC0, 0x01, 0x0E, 0x20, 0x00, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10,
        0x60, 0x18, 0x10, 0xC0, 0x2F, 0x18, 0x80, 0xE7, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"3",19*/
    {
        0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x98, 0x00, 0x00, 0x84, 0x00, 0x00, 0x83, 0x10,
        0x80, 0x80, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x00, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x00
    }, /*"4",20*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x3F, 0x0B, 0x20, 0x10, 0x10, 0x20, 0x08, 0x10, 0x20, 0x08, 0x10,
        0x20, 0x08, 0x10, 0x20, 0x18, 0x1C, 0x20, 0xF0, 0x0F, 0x20, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"5",21*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x21, 0x0C, 0x40, 0x10, 0x18, 0x20, 0x08, 0x10,
        0x20, 0x08, 0x10, 0x20, 0x08, 0x10, 0xE0, 0x18, 0x08, 0xC0, 0xF0, 0x0F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00
    }, /*"6",22*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F,
        0x20, 0xE0, 0x1F, 0x20, 0x18, 0x00, 0x20, 0x07, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"7",23*/
    {
        0x00, 0x00, 0x00, 0x80, 0x83, 0x07, 0xC0, 0xCF, 0x0F, 0x60, 0x6C, 0x08, 0x20, 0x18, 0x10, 0x20, 0x10, 0x10,
        0x20, 0x30, 0x10, 0x20, 0x30, 0x10, 0x60, 0x68, 0x18, 0xC0, 0xCF, 0x0F, 0x80, 0x83, 0x07, 0x00, 0x00, 0x00
    }, /*"8",24*/
    {
        0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xC0, 0x3F, 0x0C, 0xC0, 0x60, 0x1C, 0x20, 0x40, 0x10, 0x20, 0x40, 0x10,
        0x20, 0x40, 0x10, 0x20, 0x20, 0x08, 0xC0, 0x10, 0x0F, 0x80, 0xFF, 0x03, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00
    }, /*"9",25*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C,
        0x00, 0x1C, 0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*":",26*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8,
        0x00, 0x0C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*";",27*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00,
        0x00, 0x01, 0x01, 0x80, 0x00, 0x02, 0x40, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"<",28*/
    {
        0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00,
        0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00
    }, /*"=",29*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x40, 0x00, 0x04, 0x80, 0x00, 0x02,
        0x00, 0x01, 0x01, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00
    }, /*">",30*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x40, 0x06, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x1C,
        0x20, 0xE0, 0x1C, 0x20, 0x10, 0x1C, 0x20, 0x18, 0x00, 0x60, 0x08, 0x00, 0xC0, 0x0F, 0x00, 0x80, 0x07, 0x00
    }, /*"?",31*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xC0, 0xFF, 0x07, 0xE0, 0x00, 0x0E, 0x20, 0xF8, 0x18, 0x10, 0xFF, 0x11,
        0x90, 0x03, 0x11, 0x90, 0xFC, 0x11, 0xA0, 0x07, 0x09, 0x60, 0x80, 0x0C, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x00
    }, /*"@",32*/
    {
        0x00, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x00, 0x80, 0x13, 0x00, 0x78, 0x10, 0x80, 0x47, 0x00, 0x60, 0x40, 0x00,
        0xE0, 0x41, 0x00, 0x00, 0x5F, 0x00, 0x00, 0xF0, 0x11, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10
    }, /*"A",33*/
    {
        0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10,
        0x20, 0x10, 0x10, 0x60, 0x18, 0x10, 0xC0, 0x2F, 0x18, 0xC0, 0xE7, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00
    }, /*"B",34*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x40, 0x00, 0x18, 0x20, 0x00, 0x10,
        0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x60, 0x00, 0x08, 0xE0, 0x00, 0x0C, 0x80, 0x03, 0x03, 0x00, 0x00, 0x00
    }, /*"C",35*/
    {
        0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10,
        0x20, 0x00, 0x10, 0x40, 0x00, 0x08, 0xC0, 0x01, 0x0E, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00
    }, /*"D",36*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10,
        0x20, 0x10, 0x10, 0x20, 0xFC, 0x10, 0x60, 0x00, 0x10, 0x60, 0x00, 0x18, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00
    }, /*"E",37*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x00,
        0x20, 0x10, 0x00, 0x20, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00
    }, /*"F",38*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x18, 0x20, 0x00, 0x10,
        0x20, 0x40, 0x10, 0x20, 0x40, 0x10, 0x40, 0xC0, 0x0F, 0x80, 0xC3, 0x0F, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00
    }, /*"G",39*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
        0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10
    }, /*"H",40*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F,
        0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"I",41*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0xC0,
        0xE0, 0xFF, 0x7F, 0xE0, 0xFF, 0x3F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"J",42*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x30, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x3A, 0x00,
        0xA0, 0xE1, 0x00, 0xE0, 0x80, 0x13, 0x60, 0x00, 0x1E, 0x20, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"K",43*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10,
        0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00
    }, /*"L",44*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0x0F, 0x10, 0x00, 0xFF, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x80, 0x07,
        0x00, 0x7C, 0x00, 0xC0, 0x03, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"M",45*/
    {
        0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0x01, 0x10, 0x80, 0x07, 0x10, 0x00, 0x1E, 0x00,
        0x00, 0x78, 0x00, 0x20, 0xC0, 0x03, 0x20, 0x00, 0x0F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00
    }, /*"N",46*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x18, 0x20, 0x00, 0x10,
        0x20, 0x00, 0x10, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x0C, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00
    }, /*"O",47*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x20, 0x10, 0x20, 0x20, 0x10, 0x20, 0x20, 0x00,
        0x20, 0x20, 0x00, 0x20, 0x30, 0x00, 0x40, 0x10, 0x00, 0xC0, 0x1F, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00
    }, /*"P",48*/
    {
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x60, 0x00, 0x19, 0x20, 0x00, 0x11,
        0x20, 0x00, 0x17, 0x60, 0x00, 0x3C, 0xC0, 0x00, 0x6C, 0x80, 0xFF, 0x67, 0x00, 0xFE, 0x21, 0x00, 0x00, 0x00
    }, /*"Q",49*/
    {
        0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00,
        0x20, 0x70, 0x00, 0x20, 0xD0, 0x01, 0x60, 0x08, 0x07, 0xC0, 0x0F, 0x1E, 0x80, 0x07, 0x18, 0x00, 0x00, 0x10
    }, /*"R",50*/
    {
        0x00, 0x00, 0x00, 0x80, 0x07, 0x07, 0xC0, 0x0F, 0x0C, 0x60, 0x1C, 0x08, 0x20, 0x18, 0x10, 0x20, 0x38, 0x10,
        0x20, 0x30, 0x10, 0x20, 0x70, 0x10, 0x40, 0xE0, 0x18, 0xE0, 0xE1, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00
    }, /*"S",51*/
    {
        0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F,
        0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00
    }, /*"T",52*/
    {
        0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0xE0, 0xFF, 0x0F, 0x20, 0x00, 0x18, 0x00, 0x00, 0x10,
        0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0xE0, 0xFF, 0x07, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"U",53*/
    {
        0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x20, 0x7E, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1E,
        0x00, 0x80, 0x03, 0x00, 0x78, 0x00, 0xA0, 0x07, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"V",54*/
    {
        0x20, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x20, 0xFF, 0x00, 0x00, 0xC0, 0x1F, 0x20, 0xC0, 0x03, 0x60, 0x3C, 0x00,
        0xE0, 0x3F, 0x00, 0x20, 0xF0, 0x1F, 0x00, 0x80, 0x07, 0x20, 0x7C, 0x00, 0xE0, 0x03, 0x00, 0x20, 0x00, 0x00
    }, /*"W",55*/
    {
        0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x60, 0x00, 0x18, 0xE0, 0x01, 0x16, 0x20, 0x87, 0x01, 0x00, 0x7C, 0x00,
        0x00, 0xE8, 0x00, 0x20, 0x86, 0x13, 0xE0, 0x01, 0x1E, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"X",56*/
    {
        0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x20, 0x0F, 0x10, 0x00, 0x3C, 0x10, 0x00, 0xF8, 0x1F,
        0x00, 0xE0, 0x1F, 0x00, 0x18, 0x10, 0x20, 0x06, 0x10, 0xA0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00
    }, /*"Y",57*/
    {
        0x00, 0x00, 0x00, 0x80, 0x01, 0x10, 0xE0, 0x00, 0x1C, 0x60, 0x00, 0x17, 0x20, 0x80, 0x11, 0x20, 0x60, 0x10,
        0x20, 0x18, 0x10, 0x20, 0x06, 0x10, 0xA0, 0x03, 0x10, 0xE0, 0x00, 0x18, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00
    }, /*"Z",58*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x7F,
        0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"[",59*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00,
        0x00, 0xE0, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00
    }, /*"\",60*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40,
        0xFC, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"]",61*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00,
        0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"^",62*/
    {
        0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
        0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80
    }, /*"_",63*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00,
        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"`",64*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x98, 0x1F, 0x00, 0x98, 0x19, 0x00, 0x84, 0x10, 0x00, 0x44, 0x10,
        0x00, 0x44, 0x10, 0x00, 0x44, 0x08, 0x00, 0xFC, 0x0F, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18
    }, /*"a",65*/
    {
        0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x0F, 0x00, 0x18, 0x08, 0x00, 0x08, 0x10,
        0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x18, 0x00, 0xF8, 0x0F, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00
    }, /*"b",66*/
    {
        0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x18, 0x0C, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10,
        0x00, 0x04, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x38, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"c",67*/
    {
        0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x1C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10,
        0x20, 0x04, 0x10, 0x20, 0x08, 0x08, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00
    }, /*"d",68*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x88, 0x0C, 0x00, 0x84, 0x10,
        0x00, 0x84, 0x10, 0x00, 0x84, 0x10, 0x00, 0x8C, 0x10, 0x00, 0xF8, 0x08, 0x00, 0xE0, 0x04, 0x00, 0x00, 0x00
    }, /*"e",69*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x80, 0xFF, 0x1F, 0xC0, 0xFF, 0x1F,
        0x60, 0x04, 0x10, 0x20, 0x04, 0x10, 0x20, 0x04, 0x10, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"f",70*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x7E, 0x00, 0xF8, 0xCF, 0x00, 0x8C, 0x85, 0x00, 0x04, 0x85,
        0x00, 0x0C, 0x8D, 0x00, 0xFC, 0xCD, 0x00, 0xF4, 0x78, 0x00, 0x0C, 0x78, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00
    }, /*"g",71*/
    {
        0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x00,
        0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"h",72*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x60, 0xFC, 0x1F,
        0x60, 0xFE, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"i",73*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80,
        0x60, 0x04, 0xC0, 0x60, 0xFC, 0x7F, 0x60, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"j",74*/
    {
        0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x80, 0x10, 0x00, 0x40, 0x00,
        0x00, 0xE0, 0x00, 0x00, 0x1C, 0x13, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"k",75*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F,
        0xF0, 0xFF, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"l",76*/
    {
        0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F,
        0x00, 0xF8, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x10
    }, /*"m",77*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x04, 0x00,
        0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
    }, /*"n",78*/
    {
        0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF0, 0x0F, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x10, 0x00, 0x04, 0x10,
        0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x0C, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00
    }, /*"o",79*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0xFC, 0xFF, 0x00, 0xFC, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90,
        0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x1C, 0x00, 0xF8, 0x0F, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00
    }, /*"p",80*/
    {
        0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x1C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10,
        0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0xF8, 0xFF, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00
    }, /*"q",81*/
    {
        0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0xFC, 0x1F, 0x00, 0xFC, 0x1F, 0x00, 0x10, 0x10,
        0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00
    }, /*"r",82*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1E, 0x00, 0x78, 0x18, 0x00, 0xCC, 0x10, 0x00, 0xC4, 0x10,
        0x00, 0x84, 0x11, 0x00, 0x84, 0x19, 0x00, 0x0C, 0x1F, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"s",83*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFF, 0x0F, 0xC0, 0xFF, 0x1F,
        0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"t",84*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10,
        0x00, 0x00, 0x10, 0x00, 0x04, 0x08, 0x00, 0xFC, 0x1F, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00
    }, /*"u",85*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x00, 0x1F,
        0x00, 0x00, 0x0C, 0x00, 0x80, 0x03, 0x00, 0x74, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
    }, /*"v",86*/
    {
        0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF4, 0x01, 0x00, 0x80, 0x1F, 0x00, 0x04, 0x0F, 0x00, 0xEC, 0x00,
        0x00, 0xFC, 0x00, 0x00, 0x84, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0xE4, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00
    }, /*"w",87*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x1C, 0x00, 0x3C, 0x12, 0x00, 0xE4, 0x01,
        0x00, 0xC0, 0x01, 0x00, 0x24, 0x13, 0x00, 0x1C, 0x1C, 0x00, 0x04, 0x18, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00
    }, /*"x",88*/
    {
        0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xC0, 0x00, 0x3C, 0x80, 0x00, 0xC4, 0x81, 0x00, 0x00, 0x7F,
        0x00, 0x00, 0x0E, 0x00, 0xC4, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
    }, /*"y",89*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x13, 0x00, 0xC4, 0x11,
        0x00, 0x74, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"z",90*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
        0x00, 0x28, 0x00, 0xF8, 0xC7, 0x3F, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"{",91*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"|",92*/
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0xF8, 0xC7, 0x3F, 0x00, 0x28, 0x00,
        0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"}",93*/
    {
        0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00,
        0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00
    }, /*"~",94*/
};

/** endregion */


static uint8_t OLEDFont_getCharDotMatrix(uint8_t *dotMatrix, const uint8_t fontSize, const uint8_t *font) {
    // Dot matrix bytes
    const uint8_t fontByteSize = (fontSize / 8 + (fontSize % 8 ? 1 : 0)) * (fontSize / 2);
    const uint8_t chr = *font - ' ';

    switch (fontSize) {
        case 12: memcpy(dotMatrix, asc_1206[chr], fontByteSize);
            return 1;
        case 16: memcpy(dotMatrix, asc_1608[chr], fontByteSize);
            return 1;
        case 24: memcpy(dotMatrix, asc_2412[chr], fontByteSize);
            return 1;
        default: return 0;
    }
}
